/*
 * $Header: /opt/javacvs/bk/src/main/java/com/uusee/framework/dao/UniversalDao.java,v 1.1 2009/04/02 10:08:53 wangrui Exp $
 * $Revision: 1.1 $
 * $Date: 2009/04/02 10:08:53 $
 * ============================================================================
 *
 * Copyright (c) 2007 Beijing uusee Tech CO.,  All rights reserved.
 *
 * ============================================================================
 */
package com.uusee.framework.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import org.springframework.orm.ObjectRetrievalFailureException;
import com.uusee.framework.util.query.CriteriaInfo;

/**
 * 数据访问对象(DAO)接口.
 * 
 * @author <a href="mailto:wangr.bj@gmail.com">WangRui</a> <a href="mailto:du_yi@bbn.cn">DuYi</a>
 * 
 */
public interface UniversalDao {
	/**
	 * 取得所有的实体对象。
	 * 
	 * @param clazz 实体类型
	 * @return 包含所有实体对象的List
	 */
	<T> List<T> getAll(Class<T> clazz);

	/**
	 * 根据实体Id取得实体对象,不存在时抛出ObjectRetrievalFailureException例外。
	 * 
	 * @param clazz 实体类型
	 * @param id 实体Id
	 * @return 实体对象
	 * @see org.springframework.orm.ObjectRetrievalFailureException
	 */
	<T> T getById(Class<T> clazz, Serializable id) throws ObjectRetrievalFailureException;

	/**
	 * 合并实体对象
	 * 
	 * @param o 合并的实体对象
	 * @return 合并了的实体对象
	 */
	<T> T merge(T o);

	/**
	 * 保存实体对象
	 * 
	 * @param o 保存的实体对象
	 * @return 保存了的实体对象
	 */
	<T> T save(T o);

	/**
	 * 更新实体对象
	 * 
	 * @param o 更新的实体对象
	 * @return 更新了的实体对象
	 */
	<T> void update(T o);

	/**
	 * 通过实体Id,删除实体。
	 * 
	 * @param clazz 实体类型
	 * @param id 实体Id
	 */
	<T> void delete(Class<T> clazz, Serializable id);

	/**
	 * 批量持久化实体
	 * 
	 * @param <T>
	 * @param entity
	 */
	<T> void batchSave(T... entity);
	
	/**
	 * 批量持久化实体
	 * 
	 * @param <T>
	 * @param entity
	 */
	<T> void batchSave(Collection<T> entitys);

	/**
	 * 批量更新实体
	 * 
	 * @param <T>
	 * @param entity
	 */
	<T> void batchUpdate(T... entity);

	/**
	 * 批量删除实体
	 * 
	 * @param <T>
	 * @param clazz
	 * @param id
	 */
	<T> void batchDelete(Class<T> clazz, Serializable... id);

	/**
	 * 取得所有实体的数目。
	 * 
	 * @param clazz 实体类型
	 * @return 所有实体的数目
	 */
	<T> int getCount(Class<T> modelClass);

	/**
	 * 通过CriteriaInfo查询
	 * 
	 * @param <T>
	 * @param modelClass
	 * @param ci
	 * @return
	 */
	public <T> List<T> getEntitiesByCriteriaInfo(final Class<T> modelClass, final CriteriaInfo ci);

	/**
	 * 通过CriteriaInfo查询实体数量
	 * 
	 * @param <T>
	 * @param modelClass
	 * @param ci
	 * @return
	 */
	public <T> int getCountByCriteriaInfo(final Class<T> modelClass, final CriteriaInfo ci);
}